//
// Created by 寻欢 on 2021-10-10.
//

// 2019240004 董博阳 大数据191 实验二 进程管理

#include<windows.h>
#include<process.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <conio.h>

struct PROCESS {
    intptr_t hProcess;
    char name[40];
} process[4] = {{0,"Anny"},{0,"Beth"},{0,"Carl"},{0,"Dave"}};

int main(int argc,char *argv[]){
    int termstat,c;

    srand((unsigned)time(NULL)); //Send randomizer

    //If no arguments, this is the calling process
    if(argc == 1){
        //Spawn processes in numeric order
        for(c = 0;c < 4;c++){
            _flushall();

            /*
             * 为模式 _spawnl指定的 _spawnl_wspawnl (_P_WAIT 返回 值) 是新进程的退出状态。
             * 为模式或模式指定的_spawnl_wspawnl (_P_NOWAIT_P_NOWAITO 异步) 返回值是进程句柄。
             * 如果进程正常终止，则退出状态为 0。 如果生成的进程专门使用非零参数调用退出例程，可以将退出状态设置为非零值。
             * 如果更新过程没有显式设置正退出状态，则正退出状态指示因中止或中断而异常退出。 返回值 -1 表示 (进程未启动时) 。
             * 在这种情况下 ，errno 设置为以下值之一。
             */
            process[c].hProcess = _spawnl(_P_NOWAIT,argv[0],argv[0],
                                          process[c].name,NULL);
        }

        //Wait for randomly specified process,and respond when done
        c = rand() % 4;
        printf("Come here, %s.\n",process[c].name);
        _cwait(&termstat,process[c].hProcess,_WAIT_CHILD);
        printf("Thank you, %s.\n",process[c].name);

        getch();

    }//If there are arguments ,this must be a spawned process
    else{
        //Delay for a period that's determined by process number
        Sleep((argv[1][0] - 'A' + 1) * 1000L);
        printf("Hi, Dad .It's %s .\n",argv[1]);
    }

}
